package com.demo.livemanagement.livedelayqueue;

import java.util.List;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;

public class LiveDelayQueue<T extends Delayed> {

	@SuppressWarnings("rawtypes")
	private static LiveDelayQueue queue;

	private DelayQueue<T> storage = new DelayQueue<T>();

	@SuppressWarnings("rawtypes")
	public static synchronized LiveDelayQueue getInstance() {
		if (queue == null)
			queue = new LiveDelayQueue<>();
		return queue;
	}

	/** 将指定的元素插入队尾 */
	public void offer(T v) {
		storage.offer(v);
	}

	/** 队列的长度 */
	public int size() {
		return storage.size();
	}

	/**
	 * 
	 * @throws InterruptedException
	 */
	public T take() throws InterruptedException {
		return storage.take();
	}

	/** 检索，但是不移除队列的头，如果此队列为空，则返回 null */
	public T peek() {
		return storage.peek();
	}

	/** 检索，但是不移除此队列的头 */
	/** 此方法与 peek 方法的惟一不同是，如果此队列为空，它会抛出一个异常 */
	public T element() {
		return storage.element();
	}

	/** 检索并移除此队列的头，如果队列为空，则返回 null */
	public T poll() {
		return storage.poll();
	}

	/** 检索并移除此队列的头 */
	/** 此方法与 poll 方法的不同在于，如果此队列为空，它会抛出一个异常 */
	public T remove() {
		return storage.remove();
	}

	/** 队列是否为空 */
	public boolean empty() {
		return storage.isEmpty();
	}

	/** 打印队列元素 */
	public String toString() {
		return storage.toString();
	}

	/** 将整个List插入queue */
	public boolean addAll(List<T> list) {
		return storage.addAll(list);
	}
	/** 将整个List插入queue */
	public void clear() {
		 storage.clear();
	}

}
